#include "usart.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"

void USART1_Init(void)
{
    // 1.开启时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);

    // 2.配置引脚 PA9(Tx) PA10(Rx)
    // PA9：复用推挽输出 50MHz CNF=10 MODE=11
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // PA10：浮空输入 CNF=00 MODE=00
    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    GPIO_Init(GPIOA, &GPIO_InitStruct);

    // 3.串口配置
    USART_InitTypeDef USART_InitStruct;
    // 3.1波特率
    USART_InitStruct.USART_BaudRate = 115200;
    // 3.2 收发使能及模块使能
    USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; 
    // 3.3 其它配置
    USART_InitStruct.USART_WordLength = USART_WordLength_8b; // 8位数据
    USART_InitStruct.USART_Parity = USART_Parity_No; // 无奇偶校验位
    USART_InitStruct.USART_StopBits = USART_StopBits_1; // 1个停止位
    USART_Init(USART1, &USART_InitStruct);

    // 4.使能串口
    USART_Cmd(USART1, ENABLE);
}

void USART1_SendChar(uint8_t ch)
{
    // 判断SR中TEX是否为1，为1则发送完毕
    while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
    // 向DR写入新的待发送数据
    USART_SendData(USART1, ch);
}

int fputc(int c, FILE *file)
{
    USART1_SendChar(c);
    return c;
}
